package com.mjf.sort;

import java.util.Arrays;

/**
 * 插入排序
 * <p>
 * 思路：<br>
 * 1. 把n个待排序的元素看成为一个有序表和一个无序表，开始时有序表中只包含一个元素，无序表中包含有n-1个元素<br>
 * 2. 排序过程中每次从无序表中取出第一个元素，把它的排序码依次与有序表元素的排序码进行比较，将它插入到有序表中的适当位置，使之成为新的有序表。
 * <p>
 * 问题：当需要插入的数是较小的数时，后移的次数明显增多，对效率有影响<br>
 * 优化方案：使用希尔排序移位法
 *
 * @see ShellSort#shellSortWithMovePosition(int[]) 希尔排序【移位法】
 * <p>
 * 时间复杂度：O(n²)
 * <p>
 * 空间复杂度：O(1)
 */
public class InsertSort {
    public static void main(String[] args) {

        int[] arr = {3, 9, -1, 10, -2, 12};
        System.out.println("排序前: " + Arrays.toString(arr));
        insertSort(arr);
        System.out.println("排序后: " + Arrays.toString(arr));

    }

    public static void insertSort(int[] arr) {
        int insertVal;  // 待插入元素
        int insertIndex;    // 待插入索引

        for (int i = 1; i < arr.length; i++) {
            insertVal = arr[i];
            insertIndex = i - 1;
            while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
                arr[insertIndex + 1] = arr[insertIndex];
                insertIndex--;
            }
            arr[insertIndex + 1] = insertVal;
//            System.out.printf("第%d次排序后的结果为%s\n", i, Arrays.toString(arr));
        }
    }
}
